
import 'package:flutter/material.dart';
import 'package:xsdk_flutter/xsdk/framework/page/x_page_state.dart';
import 'package:xsdk_flutter/xsdk/utils/x_utils_widget.dart';


/*
页面父类基础界面
listView通用State,
支持添加listview内部头部和尾部(滚动)
支持分页

 */
abstract class XPageListViewHeaderFooterState extends XPageState {


  /*
  可在子类取消required(这里强制required则子类会提示生成构造方法)
  各种listview类型在子类的构造方法中设置其值
   */
  XPageListViewHeaderFooterState(
      {
        super.isKeepPageState=false,
        super.xTag,
        super.handleAndFinishPageFunction,
      }
      );


  //重写方法///////////////////////////////////////////////////

  /*
  构建item的widget
  强转: Car item= listItem as Car;
  注意:
  1.getListItemWidget要以item绘制widget,避免使用position
  2.删除操作时,使用position(避免相同item情况)
  注意:有些listview要求每个item都需要有key,那么就要用XWidgetUtils.getLayoutContainer包一层
   */
  @required
  Widget getListItemWidget(dynamic listItem,int position);

  @required
  List<Widget>? getListViewHeaderWidgets();
  @required
  List<Widget>? getListViewFooterWidgets();


  EdgeInsets getListViewPadding(){
    return XWidgetUtils.getEdgeInsets(0, 0, 0, 0);
  }

  //分页,重写/////////////////////////////////////////////////////////
  /*
  分页统一使用:
  widget.currentPageIndex;
  widget.totalPages;
   */

  //是否启用分页加载数据
  bool getIsEnablePageLoadData(){
    return false;
  }

  //是否启用下拉刷新数据
  bool getIsEnableRefreshLoadData(){
    return false;
  }

  //是否支持滑动删除item
  bool getIsEnableSlideRemoveItem(){
    return false;
  }


  @override
  bool getIsPageIndexStartWith1() {
    //分页加载是否从第1页开始,否则从0开始
    return true;
  }

  //私有方法/////////////////////////////////////////////////////////

  //弹出输入框重绘高度
  @override
  bool getIsResizeToAvoidBottomInset() {
    return true;
  }

  /*
  添加AnimatedList控件
   */
  @override
  Widget getBodyWidget(BuildContext context) {

    if(widget.listData.length==0 && getEmptyDataWidget()!=null){
      return getEmptyDataWidget()!;
    }

    List<Widget> listWidgets=[];
    List<Widget>? listViewHeaderWidgets=getListViewHeaderWidgets();
    List<Widget>? listViewFooterWidgets=getListViewFooterWidgets();
    //
    if(listViewHeaderWidgets!=null && listViewHeaderWidgets.isNotEmpty){
      listWidgets.addAll(listViewHeaderWidgets);
    }

    //
    listWidgets.add(
        XWidgetUtils.getWidgetListView(
          listData:widget.listData,
          shrinkWrap:true,
          listItemWidgetFunction:(BuildContext context,int index){
            //支持item左右上下滑动
            return getIsEnableSlideRemoveItem()?_buildDismissibleForSupportItemSlideRemove(widget.listData[index],index):getListItemWidget(widget.listData[index],index);
          },
        )
    );
    //
    if(listViewFooterWidgets!=null&&listViewFooterWidgets.isNotEmpty){
      listWidgets.addAll(listViewFooterWidgets);
    }

    return XWidgetUtils.getLayoutSingleChildScrollView(
      padding:getListViewPadding(),
      //支持分页
      initialScrollOffset: widget.currentListViewPosition,
      onNotifyScrollStop: !getIsEnablePageLoadData()?null:(ScrollController? scrollController){
        //启用分页加载数据
        widget.currentListViewPosition=scrollController?.offset??0.0;
      },
      onNotifyScrollBottomPosition: !getIsEnablePageLoadData()?null:(e){
        //滑动到底部通知,加载下一页
        if(widget.currentPageIndex<widget.totalPages){
          updateData(pageIndex: widget.currentPageIndex+1);
        }
      },
      onRefresh: !getIsEnableRefreshLoadData()?null:() async{
        widget.currentListViewPosition=0.0;
        updateData(pageIndex: getIsPageIndexStartWith1()?1:0);
      },
      child: XWidgetUtils.getLayoutColumn(children: listWidgets),
    );


  }


  //当没有数据时,显示提示图
  Widget? getEmptyDataWidget(){
    return null;
  }


  /*
  使用Dismissible支持item滑动:

  direction 为限制滑动关闭方向，在 onDismissed / confirmDismiss 中也可以进行判断；
DismissDirection.vertical 竖直方向，包括 up / down 两种
DismissDirection.horizontal 水平方向，包括 endToStart / startToEnd 两种
DismissDirection.endToStart 结束到开始方向(与语言设置的 rtl 和 ltr 相关)，汉英等日常方向一般是从右至左
DismissDirection.startToEnd 开始到结束方向(与语言设置的 rtl 和 ltr 相关)，汉英等日常方向一般是从左至右
DismissDirection.up 由下向上
DismissDirection.down 由上向下

confirmDismiss 返回的是 Future 类型的数据，用于判断是否可清除当前 Widget，
返回 true 时清除此 Widget，否则将其移回到其原始位置；
当返回 false / null 时，均不会进入 onDismissed / onResize 回调；
其中 onDismissed 为确认清除当前 Widget 的回调，onResize 为当前 Widget 改变尺寸时的回调；
在 confirmDismiss / onDismissed 中可以根据 direction 滑动方向进行单独判断；

  dismissThresholds 可根据各方向设置不同的阀值，对应的是一个 Map 集合；范围在(0.0, 1.0) 之间，设置的阀值越大，代表滑动范围越大才可以触发 onDismissed 回调；
  dismissThresholds: {
  DismissDirection.startToEnd: 0.8,
  DismissDirection.endToStart: 0.3
},
   */

  Widget _buildDismissibleForSupportItemSlideRemove(dynamic listItem,int position){
    return Dismissible(
      key:UniqueKey(),
      //onUpdate: ,//每个滑动像素事件
      //confirmDismiss: ,//默认item全都可删除
      //onResize:,//重新修改尺寸回调(优先onDismissed执行)
      onDismissed: (DismissDirection direction){
        //滑动有效触发后回调(ui移除item)
        //XLogUtils.printLog('----item滑动方向= $direction,position=$position');
        //删除数据ok(注意:实测Dismissible的删除并没有更新ui的位置,即position没有更新,因此不能用removeAt(),Dismissible只能和ListView一起使用,不能和AnimatedList使用(无法更新AnimatedList的ui中的item位置))
        setState(() {
          widget.listData.remove(listItem);
        });
      },
      //滑动方向(向左向右滑动都可删除)
      direction: DismissDirection.horizontal,//!isItemSupportSlideRemove?DismissDirection.none:DismissDirection.horizontal,
      background: _createDismissibleRemoveBackgroundWidget(),
      secondaryBackground: _createSecondDismissibleRemoveBackgroundWidget(),
      child: getListItemWidget(listItem,position),
    );

  }


  //滑出item删除时(向左滑),Dismissible的背景widget,显示删除图标
  _createDismissibleRemoveBackgroundWidget() {
    return XWidgetUtils.getLayoutContainer(
        backgroundColor: const Color(0xffff0000),
        child: XWidgetUtils.getLayoutAlign(
          alignment:Alignment.centerLeft,
          child:XWidgetUtils.getLayoutPadding(
              padding:const EdgeInsets.symmetric(horizontal: 15.0),
              child:XWidgetUtils.getLayoutFittedBox(
                  XWidgetUtils.getLayoutColumn(
                      children:[
                        const Icon(Icons.delete, color: Colors.white),
                        const Text('删除', style: TextStyle(color: Colors.white,fontSize: 12))
                      ]))
          ),
        )
    );
  }

  //Dismissible的第二背景(向右滑)
  _createSecondDismissibleRemoveBackgroundWidget() {
    return XWidgetUtils.getLayoutContainer(
        backgroundColor: const Color(0xffff0000),
        child: XWidgetUtils.getLayoutAlign(
          alignment:Alignment.centerRight,
          child:XWidgetUtils.getLayoutPadding(
              padding:const EdgeInsets.symmetric(horizontal: 15.0),
              child:XWidgetUtils.getLayoutFittedBox(
                  XWidgetUtils.getLayoutColumn(
                      children:[
                        const Icon(Icons.delete, color: Colors.white),
                        const Text('删除', style: TextStyle(color: Colors.white,fontSize: 12))
                      ]))
          ),
        )
    );
  }


  //数据更新///////////////////////////

  void setXListData_pageIndexData(
      int? pageIndex,
      int? pageCount,
      List<dynamic>? items
      ){

    if(mounted){
      setState((){

        pageIndex??=0;
        pageCount??=0;

        //判断是否删除所有数据
        if(getIsPageIndexStartWith1()){
          //分页从第1页开始
          if(pageIndex==0 || pageIndex==1){
            widget.listData.clear();
          }
        }else{
          //分页从0开始
          if(pageIndex==0){
            widget.listData.clear();
          }
        }

        widget.currentPageIndex=pageIndex!;
        widget.totalPages=pageCount!;

        //
        if(items!=null){
          widget.listData.addAll(items);
        }

      });
    }

  }


  //追加单条数据,适合ListView,AnimatedList使用,但不适合Dismissible使用
  void setXListData_addOneItem(
      dynamic item,
      {
        int? position, //插入位置
      }
      ){

    if(mounted){
      setState((){
        //先添加item,后更新
        if(position==null || position!<0){
          //在末尾添加
          widget.listData.add(item);
        }else{
          //按位置插入
          if(position!>widget.listData.length){
            position=widget.listData.length;
          }
          widget.listData.insert(position!, item);
        }
      });
    }


  }

  //追加多条
  void setXListData_addAllItems(
      List<dynamic>? items,
      {
        int? position, //插入位置
        bool isReplaceAllItems=true,//替换所有数据
      }
      ){

    if(mounted){
      setState((){

        if(isReplaceAllItems){
          widget.listData.clear();
        }

        if(items!=null) {
          //先添加item,后更新
          if (position == null || position! < 0) {
            //在末尾添加
            widget.listData.addAll(items);
          } else {
            //按位置插入
            if (position! > widget.listData.length) {
              position = widget.listData.length;
            }
            widget.listData.insertAll(position!, items);
          }
        }
      });
    }



  }

  //删除数据(适合存在重复相同的数据,按位置删除)
  void setXListData_removeItemByPosition(int position){
    if(mounted){
      setState((){
        //widget.listData.remove(item);
        widget.listData.removeAt(position);
      });
    }

  }


  //删除所有数据
  void setXListData_removeAllItems(){

    if(mounted){
      setState((){
        widget.listData.clear();
      });
    }

  }

}